home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_11 / gilhool2 / mainwnd.c < prev    next >
Encoding:
Text File  |  1995-10-10  |  9.7 KB  |  405 lines

  1. Hi Marc! 
  2.     Here is the source (ASCII). Each file has a line dividing it
  3. from the rest. The makefile is specific to Visual C++, so I don't know
  4. if you want to include it - most Windows compilers will have a way
  5. to generate a makefile or project file, given the source code.
  6.  
  7.     kjg
  8.  
  9. ---------------- PULSE.C      -- (Main entry point) ----------------
  10. #define GLOBALS TRUE
  11. #include "pulse.h"
  12. #undef GLOBALS
  13.  
  14. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  15. {
  16.     MSG msg;
  17.  
  18.     if (!hPrevInstance)
  19.       if (!InitApplication(hInstance))
  20.         return (FALSE);
  21.  
  22.     if (!InitInstance(hInstance, nCmdShow))
  23.       return (FALSE);
  24.  
  25.     while (GetMessage(&msg, NULL, NULL, NULL))
  26.     {
  27.       TranslateMessage(&msg);
  28.       DispatchMessage(&msg);
  29.     }
  30.     return (msg.wParam);
  31. }
  32.  
  33.  
  34. BOOL InitApplication(HINSTANCE hInstance)
  35. {
  36.     WNDCLASS  wc;
  37.  
  38.     wc.style = NULL;
  39.     wc.lpfnWndProc = MainWndProc;
  40.     wc.cbClsExtra = 0;
  41.     wc.cbWndExtra = 0;
  42.     wc.hInstance = hInstance;
  43.     wc.hIcon = NULL;
  44.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  45.     wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  46.     wc.lpszMenuName =  NULL;
  47.     wc.lpszClassName = "PulseWClass";
  48.  
  49.     return (RegisterClass(&wc));
  50.  
  51. }
  52.  
  53. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  54. {
  55.     HWND    hWnd;
  56.  
  57.     hWnd = CreateWindow("PulseWClass",
  58.                         "Pulse",
  59.                         WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,
  60.                         CW_USEDEFAULT,
  61.                         CW_USEDEFAULT,
  62.                         100,
  63.                         50,
  64.                         NULL,
  65.                         NULL,
  66.                         hInstance,
  67.                         NULL);
  68.  
  69.     if (!hWnd)
  70.       return (FALSE);
  71.  
  72.     ShowWindow(hWnd, nCmdShow);
  73.     UpdateWindow(hWnd);
  74.     return (TRUE);
  75.  
  76. }
  77.  
  78. ---------------- MAINWND.C    -- (Window Procedure) ----------------
  79. #include "pulse.h"
  80. /*
  81.     Routine:    MainWndProc
  82.     Called By:  Windows
  83.     Usage:      This is the window procedure for the main window
  84. */
  85.  
  86. long FAR PASCAL MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  87. {
  88.  
  89.        char         szBuffer[BUFMAX+1];
  90.            char             szTitle[BUFMAX+1];
  91. static DWORD        dwIn = 0,
  92.                     dwOut = 0;
  93. static DWORD        MaxTicks = 0,
  94.                     MinTicks = 32767;
  95.        DWORD        Ticks;
  96.        HDC          hDC;
  97.        HMENU        hPulseMenu;
  98.        PAINTSTRUCT  ps;
  99.        POINT        ptClick;
  100.        RECT         rect;
  101.  
  102.     switch (message)
  103.     {
  104. /*
  105. read INI file, reset window position to previous, floating over all other, start clock
  106. */
  107.       case WM_CREATE:
  108.         GetIni();
  109.             SetWindowPos(hWnd, HWND_TOPMOST, nXPos, nYPos, 100, 50, 0);
  110.         SetTimer(hWnd, ID_TIMER, (UINT)1000, NULL);
  111.         break;
  112. /*
  113. save the last position (for restoring on restart)
  114. */
  115.       case WM_MOVE:
  116.         nXPos = LOWORD(lParam);
  117.         nYPos = HIWORD(lParam);
  118.         wsprintf(szBuffer, "%d", nXPos);
  119.         WriteProfileString("Pulse", "XPos", szBuffer);
  120.         wsprintf(szBuffer, "%d", nYPos);
  121.         WriteProfileString("Pulse", "YPos", szBuffer);
  122.         break;
  123. /*
  124. all we do on the timer is redraw our contents
  125. */
  126.       case WM_TIMER:
  127.         InvalidateRect(hWnd, NULL, TRUE);
  128.         break;
  129.   /*
  130.   RMB creates context menu - selection processed in WM_COMMAND
  131.   */
  132.       case WM_RBUTTONDOWN:
  133.         hPulseMenu = CreatePopupMenu();
  134.         InsertMenu(hPulseMenu, 0, MF_BYPOSITION, MI_PULSE,    "&Current");
  135.         InsertMenu(hPulseMenu, 1, MF_BYPOSITION, MI_MAXPULSE, "Ma&x Pulse");
  136.         InsertMenu(hPulseMenu, 2, MF_BYPOSITION, MI_MINPULSE, "Mi&n Pulse");
  137.         ptClick = MAKEPOINT(lParam);
  138.         ClientToScreen(hWnd, &ptClick);
  139.         TrackPopupMenu(hPulseMenu, TPM_LEFTALIGN, ptClick.x, ptClick.y, 0, hWnd, NULL);
  140.         InvalidateRect(hWnd, NULL, TRUE);
  141.         DestroyMenu(hPulseMenu);
  142.         break;
  143.  
  144.       case WM_COMMAND:
  145.          Mode = wParam;
  146.          wsprintf(szBuffer, "%d", Mode);
  147.          WriteProfileString("Pulse", "Mode", szBuffer);
  148.          break;
  149.  
  150.       case WM_PAINT:
  151.         dwIn = GetTickCount();
  152.         hDC = BeginPaint(hWnd, &ps);
  153.         GetClientRect(hWnd, &rect);
  154.         if (dwOut)
  155.         {
  156.           SetTextColor(hDC, RGB(0, 0, 255));
  157.           Ticks = dwIn - dwOut;
  158.           switch (Mode)
  159.           {
  160.             case MI_PULSE:
  161.               lstrcpy(szTitle, (LPSTR)"Pulse");
  162.               wsprintf(szBuffer, "%lu Ticks", (DWORD)Ticks);
  163.               break;
  164.  
  165.             case MI_MAXPULSE:
  166.               lstrcpy(szTitle, (LPSTR)"Max Pulse");
  167.               wsprintf(szBuffer, "%lu Ticks", (DWORD)MaxTicks);
  168.               break;
  169.  
  170.             case MI_MINPULSE:
  171.               lstrcpy(szTitle, (LPSTR)"Min Pulse");
  172.               wsprintf(szBuffer, "%lu Ticks", (DWORD)MinTicks);
  173.               break;
  174.           }
  175. /*
  176. we draw the text centered in the client area
  177. */
  178.           GetClientRect(hWnd, &rect);
  179.           DrawText(hDC, szBuffer, -1,  &rect,  DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  180.           SetWindowText(hWnd, szTitle);
  181. /*
  182. reset global counters if necessary
  183. */
  184.           if (Ticks > MaxTicks)
  185.             MaxTicks = Ticks;
  186.           if (Ticks < MinTicks)
  187.             MinTicks = Ticks;
  188.         }
  189.         EndPaint(hWnd, &ps);
  190.         dwOut = GetTickCount();
  191.         break;
  192. /*
  193. pressing the home key emulates clicking the RMB
  194. */
  195.       case WM_KEYDOWN:
  196.         if (wParam == VK_HOME)
  197.           PostMessage(hWnd, WM_RBUTTONDOWN, (WPARAM)0, MAKELPARAM(0, 0));
  198.         break;
  199.  
  200.       case WM_CLOSE:
  201.         PutIni();
  202.         DestroyWindow(hWnd);
  203.         break;
  204.  
  205.       case WM_DESTROY:
  206.         PostQuitMessage(0);
  207.         break;
  208.  
  209.       default:
  210.         return (DefWindowProc(hWnd, message, wParam, lParam));
  211.         break;
  212.     }
  213.  
  214.     return (NULL);
  215. }
  216.  
  217. ---------------- INIFILE.C    -- (WIN.INI Processing) --------------
  218. #include "pulse.h"
  219. /*
  220.     Routine:    GetIni, PutIni
  221.     Called By:  various
  222.     Usage:      These routines store and fetch initialization info
  223. */
  224. void GetIni()
  225. {
  226.     nXPos      = GetProfileInt("Pulse", "XPos",    100);
  227.     nYPos      = GetProfileInt("Pulse", "YPos",    100);
  228.     Mode       = GetProfileInt("Pulse", "Mode",    100);
  229. }
  230.  
  231. void PutIni()
  232. {
  233.     char    szBuffer[20];
  234.  
  235. /*
  236. Screen Position
  237. */
  238.     wsprintf(szBuffer, "%d", nXPos);
  239.     WriteProfileString("Pulse", "XPos", szBuffer);
  240.     wsprintf(szBuffer, "%d", nYPos);
  241.     WriteProfileString("Pulse", "YPos", szBuffer);
  242. /*
  243. last active display option
  244. */
  245.     wsprintf(szBuffer, "%d", Mode);
  246.     WriteProfileString("Pulse", "Mode", szBuffer);
  247. }
  248. ---------------- PULSE.H      -- (Globals, #defines) ---------------
  249. #ifndef _PULSE_H
  250. #define _PULSE_H
  251. #include <windows.h>
  252. /*
  253. logical values, menu items
  254. */
  255. #define ID_TIMER        1000
  256. #define MI_PULSE        100
  257. #define MI_MAXPULSE     102
  258. #define MI_MINPULSE     103
  259. #define BUFMAX                  256
  260. /*
  261. global variables
  262. */
  263. #ifndef GLOBALS
  264. #define ALLOC extern
  265. #else
  266. #define ALLOC
  267. #endif
  268. ALLOC   int        Mode;               /* current display mode   */
  269. ALLOC   int        nXPos, nYPos;       /* screen location                */
  270. int  PASCAL     WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
  271. BOOL            InitApplication(HINSTANCE);
  272. BOOL            InitInstance(HINSTANCE, int);
  273. long FAR PASCAL MainWndProc(HWND, UINT, WPARAM, LPARAM);
  274. void            GetIni(void);
  275. void            PutIni(void);
  276. #endif
  277.  
  278. ---------------- PULSE.DEF    -- (Linker definitions) --------------
  279. NAME         Pulse
  280.  
  281. DESCRIPTION  'Windows Pulse Meter - Kevin Gilhooly'
  282.  
  283. EXETYPE      WINDOWS
  284.  
  285. STUB         'WINSTUB.EXE'
  286. CODE         PRELOAD MOVEABLE DISCARDABLE
  287. DATA         PRELOAD MOVEABLE MULTIPLE
  288.  
  289.  
  290. HEAPSIZE     8192
  291.  
  292. EXPORTS
  293.     MainWndProc   @1
  294.  
  295. ---------------- PULSE.MAK    -- (VC++ makefile) -------------------
  296. # Microsoft Visual C++ generated build script - Do not modify
  297.  
  298. PROJ = PULSE
  299. DEBUG = 0
  300. PROGTYPE = 0
  301. CALLER =
  302. ARGS =
  303. DLLS =
  304. D_RCDEFINES = /d_DEBUG
  305. R_RCDEFINES = /dNDEBUG
  306. ORIGIN = MSVC
  307. ORIGIN_VER = 1.00
  308. PROJPATH = C:\KJG\CUJ\PULSE\
  309. USEMFC = 0
  310. CC = cl
  311. CPP = cl
  312. CXX = cl
  313. CCREATEPCHFLAG =
  314. CPPCREATEPCHFLAG =
  315. CUSEPCHFLAG =
  316. CPPUSEPCHFLAG =
  317. FIRSTC = MAINWND.C
  318. FIRSTCPP =
  319. RC = rc
  320. CFLAGS_D_WEXE = /nologo /G2 /W3 /Zi /AM /Od /D "_DEBUG" /FR /GA /Fd"PULSE.PDB"
  321. CFLAGS_R_WEXE = /nologo /G2 /W3 /AM /O1 /D "NDEBUG" /FR /GA
  322. LFLAGS_D_WEXE = /NOLOGO /NOD /PACKC:61440 /STACK:10240 /ALIGN:16 /ONERROR:NOEXE /CO
  323. LFLAGS_R_WEXE = /NOLOGO /NOD /PACKC:61440 /STACK:10240 /ALIGN:16 /ONERROR:NOEXE
  324. LIBS_D_WEXE = oldnames libw mlibcew commdlg.lib olecli.lib olesvr.lib shell.lib
  325. LIBS_R_WEXE = oldnames libw mlibcew
  326. RCFLAGS = /nologo
  327. RESFLAGS = /nologo
  328. RUNFLAGS =
  329. DEFFILE = PULSE.DEF
  330. OBJS_EXT =
  331. LIBS_EXT =
  332. !if "$(DEBUG)" == "1"
  333. CFLAGS = $(CFLAGS_D_WEXE)
  334. LFLAGS = $(LFLAGS_D_WEXE)
  335. LIBS = $(LIBS_D_WEXE)
  336. MAPFILE = nul
  337. RCDEFINES = $(D_RCDEFINES)
  338. !else
  339. CFLAGS = $(CFLAGS_R_WEXE)
  340. LFLAGS = $(LFLAGS_R_WEXE)
  341. LIBS = $(LIBS_R_WEXE)
  342. MAPFILE = nul
  343. RCDEFINES = $(R_RCDEFINES)
  344. !endif
  345. !if [if exist MSVC.BND del MSVC.BND]
  346. !endif
  347. SBRS = MAINWND.SBR \
  348.                 PULSE.SBR \
  349.                 INIFILE.SBR
  350.  
  351.  
  352. MAINWND_DEP = c:\kjg\cuj\pulse\pulse.h
  353.  
  354.  
  355. PULSE_DEP = c:\kjg\cuj\pulse\pulse.h
  356.  
  357.  
  358. INIFILE_DEP = c:\kjg\cuj\pulse\pulse.h
  359.  
  360.  
  361. all:    $(PROJ).EXE $(PROJ).BSC
  362.  
  363. MAINWND.OBJ:    MAINWND.C $(MAINWND_DEP)
  364.         $(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c MAINWND.C
  365.  
  366. PULSE.OBJ:      PULSE.C $(PULSE_DEP)
  367.         $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c PULSE.C
  368.  
  369. INIFILE.OBJ:    INIFILE.C $(INIFILE_DEP)
  370.         $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c INIFILE.C
  371.  
  372.  
  373. $(PROJ).EXE::   MAINWND.OBJ PULSE.OBJ INIFILE.OBJ $(OBJS_EXT) $(DEFFILE)
  374.         echo >NUL @<<$(PROJ).CRF
  375. MAINWND.OBJ +
  376. PULSE.OBJ +
  377. INIFILE.OBJ +
  378. $(OBJS_EXT)
  379. $(PROJ).EXE
  380. $(MAPFILE)
  381. c:\msvc\lib\+
  382. c:\msvc\mfc\lib\+
  383. $(LIBS)
  384. $(DEFFILE);
  385. <<
  386.         link $(LFLAGS) @$(PROJ).CRF
  387.         $(RC) $(RESFLAGS) $@
  388.  
  389.  
  390. run: $(PROJ).EXE
  391.         $(PROJ) $(RUNFLAGS)
  392.  
  393.  
  394. $(PROJ).BSC: $(SBRS)
  395.         bscmake @<<
  396. /o$@ $(SBRS)
  397. <<
  398.  
  399. --- 30 ---
  400.  
  401.  
  402.  
  403.  
  404. 
  405.